package com.redepronik.negosysfab.invfac.controller;

import static com.redepronik.negosys.utils.Utils.newBigDecimal;
import static com.redepronik.negosys.utils.Utils.parametro;
import static com.redepronik.negosys.utils.Utils.presentaMensaje;
import static com.redepronik.negosys.utils.Utils.redondear;
import static com.redepronik.negosys.utils.Utils.valorConIva;
import static com.redepronik.negosys.utils.Utils.valorConPorcentaje;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.event.ActionEvent;

import org.primefaces.event.CellEditEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.redepronik.negosys.invfac.entity.Bodega;
import com.redepronik.negosys.invfac.entity.Grupo;
import com.redepronik.negosys.invfac.entity.Grupocaracteristica;
import com.redepronik.negosys.invfac.entity.Iva;
import com.redepronik.negosys.invfac.entity.Producto;
import com.redepronik.negosys.invfac.entity.Productocaracteristica;
import com.redepronik.negosys.invfac.entity.Productounidad;
import com.redepronik.negosys.invfac.entity.TipoPrecioProducto;
import com.redepronik.negosys.invfac.entity.Unidad;
import com.redepronik.negosys.invfac.entityAux.BodegaProducto;
import com.redepronik.negosys.invfac.entityAux.TablaPrecios;
import com.redepronik.negosys.invfac.service.GrupoService;
import com.redepronik.negosys.invfac.service.IvaService;
import com.redepronik.negosys.invfac.service.ProductoService;
import com.redepronik.negosys.invfac.service.UnidadService;

@Controller
@Scope("session")
public class ProductoBean {

	@Autowired
	private ProductoService productoService;

	@Autowired
	private GrupoService grupoService;

	@Autowired
	private UnidadService unidadService;

	@Autowired
	private IvaService ivaService;

	private List<Producto> listaProductos;
	private List<Grupo> listaGrupos;
	private String criterioBusqueda;
	private Grupo criterioBusquedaGrupo;

	private List<TablaPrecios> listaTpp;

	private Producto producto;
	private Iva iva;
	private List<Productocaracteristica> listaProductoCaracteristica;
	private Bodega bodega;
	private Unidad unidad;
	private TipoPrecioProducto tipoPrecioProducto;
	private TablaPrecios tablaPrecios;
	private Productounidad productoUnidad;
	private Integer decimales;

	private Integer fila;
	private List<BodegaProducto> listaBodegaProductos;

	public ProductoBean() {
	}

	public void actualizar(ActionEvent actionEvent) {
		productoService.actualizar(producto, listaTpp);
		listaProductos = new ArrayList<Producto>();
	}

	public void calcularPrecioPorGanancia(TablaPrecios tipoPrecio) {
		productoService.calcularPrecioPorGanancia(producto, tipoPrecio);
	}

	public void calcularPrecioPorIva(TablaPrecios tipoPrecio) {
		productoService.calcularPrecioPorIva(producto, tipoPrecio);
	}

	public void calcularPrecioPorPorcentaje(TablaPrecios tipoPrecio) {
		productoService.calcularPrecioPorPorcentaje(producto, tipoPrecio);
	}

	public void calcularTablaPrecios() {
		productoService.calcularPrecios(producto, listaTpp);
	}

	public void cargaEditar() {
		listaTpp = new ArrayList<TablaPrecios>();
		for (TipoPrecioProducto tipoPrecioProducto : producto
				.getTipoPrecioProductos()) {
			TablaPrecios tablaPrecios = new TablaPrecios();
			tablaPrecios.setTipoPrecioProducto(tipoPrecioProducto);
			listaTpp.add(tablaPrecios);
		}
		listaTpp = productoService.calcularPrecios(producto, listaTpp);
	}

	public void cargaMostrar() {
		listaTpp = new ArrayList<TablaPrecios>();
		for (TipoPrecioProducto tipoPrecioProducto : producto
				.getTipoPrecioProductos()) {
			TablaPrecios tablaPrecios = new TablaPrecios();
			tablaPrecios.setTipoPrecioProducto(tipoPrecioProducto);
			listaTpp.add(tablaPrecios);
		}
		listaTpp = productoService.calcularPrecios(producto, listaTpp);

		listaBodegaProductos = new ArrayList<BodegaProducto>();
		listaBodegaProductos = productoService
				.obtenerPorBodegaProducto(producto.getEan());
	}

	public void cargarInsertar() {
		producto = new Producto();
		producto.setGrupo(new Grupo());
		producto.setProductocaracteristicas(new ArrayList<Productocaracteristica>());

		producto.setProductounidads(new ArrayList<Productounidad>());
		Productounidad productoUnidad = new Productounidad();
		productoUnidad.setOrden(1);
		productoUnidad.setUnidad(unidadService.obtenerPorUnidadId(1));
		productoUnidad.setPadre(0);
		productoUnidad.setCantidad(1);
		producto.addProductounidad(productoUnidad);

		listaTpp = new ArrayList<TablaPrecios>();
		TipoPrecioProducto tpp = new TipoPrecioProducto();
		tpp.setNombre("PRECIO COSTO");
		tpp.setValor(newBigDecimal());
		tpp.setPvp(true);
		tpp.setPorcentajepreciofijo(true);
		TablaPrecios tablaPrecios = new TablaPrecios(tpp, newBigDecimal(),
				newBigDecimal(), newBigDecimal());
		listaTpp.add(tablaPrecios);
	}

	public void cargarProductoCaracteristica() {
		producto.setProductocaracteristicas(new ArrayList<Productocaracteristica>());
		producto.setGrupo(grupoService.obtenerPorGrupoId(producto.getGrupo()
				.getGrupoid()));
		for (Grupocaracteristica grupoCaracteristica : producto.getGrupo()
				.getGrupocaracteristicas()) {
			producto.addProductocaracteristica(new Productocaracteristica(null,
					grupoCaracteristica.getImprimir(), grupoCaracteristica
							.getOrden(), "", grupoCaracteristica
							.getCaracteristica(), producto));
		}
	}

	public void comprobarCaracteristica(Productocaracteristica caracteristica) {
		caracteristica.setValor(caracteristica.getValor().toUpperCase());
	}

	public void comprobarUnidad(CellEditEvent event) {
		fila = event.getRowIndex();
		boolean bn = false;
		for (int i = 0; i < producto.getProductounidads().size(); i++) {
			if (i != fila
					&& producto.getProductounidads().get(i).getUnidad()
							.getUnidadid() == producto.getProductounidads()
							.get(fila).getUnidad().getUnidadid())
				bn = true;
		}

		if (bn) {
			presentaMensaje(FacesMessage.SEVERITY_INFO, "LA UNIDAD YA EXISTE");
			producto.getProductounidads().get(fila).getUnidad().setNombre("");
		} else if (producto.getProductounidads().get(fila).getUnidad()
				.getUnidadid() != null) {
			producto.getProductounidads()
					.get(fila)
					.setUnidad(
							unidadService.obtenerPorUnidadId(producto
									.getProductounidads().get(fila).getUnidad()
									.getUnidadid()));
		}
	}

	public void eliminar(ActionEvent actionEvent) {
		productoService.eliminar(producto);
	}

	public void eliminarTipoPrecioProducto(TablaPrecios tablaPrecios) {
		productoService.eliminarTipoPrecioProducto(tablaPrecios, listaTpp);
	}

	public void eliminarUnidad(Productounidad unidad) {
		productoService.eliminarUnidad(producto, unidad);
	}

	public Bodega getBodega() {
		return bodega;
	}

	public String getCriterioBusqueda() {
		return criterioBusqueda;
	}

	public Grupo getCriterioBusquedaGrupo() {
		return criterioBusquedaGrupo;
	}

	public Integer getDecimales() {
		return decimales;
	}

	public Iva getIva() {
		return iva;
	}

	public List<BodegaProducto> getListaBodegaProductos() {
		return listaBodegaProductos;
	}

	public List<Grupo> getListaGrupos() {
		return listaGrupos;
	}

	public List<TablaPrecios> getlistaTpp() {
		return listaTpp;
	}

	public List<Productocaracteristica> getListaProductoCaracteristica() {
		return listaProductoCaracteristica;
	}

	public List<Producto> getListaProductos() {
		return listaProductos;
	}

	public Producto getProducto() {
		return producto;
	}

	public Productounidad getProductoUnidad() {
		return productoUnidad;
	}

	public TablaPrecios getTablaPrecios() {
		return tablaPrecios;
	}

	public TipoPrecioProducto getTipoPrecioProducto() {
		return tipoPrecioProducto;
	}

	public Unidad getUnidad() {
		return unidad;
	}

	@PostConstruct
	private void init() {
		limpiarObjetos();
		criterioBusquedaGrupo = new Grupo();
		iva = ivaService.obtenerPorFecha(new Date());
		listaGrupos = grupoService.obtener();
		decimales = parametro.getPrecisiondecimal();
	}

	// public void muestra() {
	// for (TablaPrecios tp : listaTpp) {
	// System.out.println("*"
	// + tp.getTipoPrecioProducto().getPorcentajepreciofijo());
	// }
	// }

	public void insertar(ActionEvent actionEvent) {
		productoService.insertar(producto, listaTpp);
	}

	public void insertarFilaTipoPrecio() {
		TablaPrecios tp = new TablaPrecios();
		tp.setTipoPrecioProducto(new TipoPrecioProducto(null, "PRECIO "
				+ (listaTpp.size() + 1), newBigDecimal(), listaTpp.size() + 1,
				false, producto, false));
		tp.setPorcentaje(newBigDecimal());
		tp.setPrecio(redondear(valorConPorcentaje(producto.getPrecio(),
				tp.getPorcentaje())));
		tp.setPrecioIva(redondear(valorConIva(tp.getPrecio())));

		listaTpp.add(tp);
	}

	public void insertarFilaUnidad() {
		producto.addProductounidad(new Productounidad(null, 0, producto
				.getProductounidads().size() + 1, 0, null, new Unidad()));
	}

	public void insertarProductoUnidad() {
		int size = producto.getProductounidads().size() - 1;
		if (producto.getProductounidads().get(size).getUnidad() != null) {
			int unidadId = producto.getProductounidads().get(size).getUnidad()
					.getUnidadid();
			List<Productounidad> list = new ArrayList<Productounidad>();
			list.addAll(producto.getProductounidads());
			list.remove(size);
			for (Productounidad pu : list)
				if (pu.getUnidad().getUnidadid() == unidadId) {
					presentaMensaje(FacesMessage.SEVERITY_ERROR,
							"LA UNIDAD YA ESTA AGREGADA");
					break;
				}
		}
	}

	public void limpiarBusqueda() {
		listaProductos = new ArrayList<Producto>();
	}

	public void limpiarObjetos() {
		producto = new Producto();
		producto.setGrupo(new Grupo());
		producto.setProductocaracteristicas(new ArrayList<Productocaracteristica>());

		unidad = new Unidad();
		productoUnidad = new Productounidad();

		tipoPrecioProducto = new TipoPrecioProducto();
		listaTpp = new ArrayList<TablaPrecios>();
		listaProductoCaracteristica = new ArrayList<Productocaracteristica>();
	}

	public void obtenerProductos() {
		listaProductos = productoService.obtener(
				criterioBusqueda.toUpperCase(),
				criterioBusquedaGrupo.getGrupoid());
	}

	public void productoUnidad() {
		if (!producto.getProductounidads().isEmpty()) {
			int size = producto.getProductounidads().size() - 1;
			if (producto.getProductounidads().get(size).getUnidad() == null)
				producto.getProductounidads().remove(size);
		}
	}

	public void pvp() {
		int posicion = listaTpp.indexOf(tablaPrecios);
		for (TablaPrecios tp : listaTpp)
			tp.getTipoPrecioProducto().setPvp(false);
		listaTpp.get(posicion).getTipoPrecioProducto().setPvp(true);
	}

	public void setBodega(Bodega bodega) {
		this.bodega = bodega;
	}

	public void setCriterioBusqueda(String criterioBusqueda) {
		this.criterioBusqueda = criterioBusqueda;
	}

	public void setCriterioBusquedaGrupo(Grupo criterioBusquedaGrupo) {
		this.criterioBusquedaGrupo = criterioBusquedaGrupo;
	}

	public void setDecimales(Integer decimales) {
		this.decimales = decimales;
	}

	public void setIva(Iva iva) {
		this.iva = iva;
	}

	public void setListaBodegaProductos(
			List<BodegaProducto> listaBodegaProductos) {
		this.listaBodegaProductos = listaBodegaProductos;
	}

	public void setListaGrupos(List<Grupo> listaGrupos) {
		this.listaGrupos = listaGrupos;
	}

	public void setlistaTpp(List<TablaPrecios> listaTpp) {
		this.listaTpp = listaTpp;
	}

	public void setListaProductoCaracteristica(
			List<Productocaracteristica> listaProductoCaracteristica) {
		this.listaProductoCaracteristica = listaProductoCaracteristica;
	}

	public void setListaProductos(List<Producto> listaProductosTabla) {
		this.listaProductos = listaProductosTabla;
	}

	public void setProducto(Producto producto) {
		this.producto = producto;
	}

	public void setProductoUnidad(Productounidad productoUnidad) {
		this.productoUnidad = productoUnidad;
	}

	public void setTablaPrecios(TablaPrecios tablaPrecios) {
		this.tablaPrecios = tablaPrecios;
	}

	public void setTipoPrecioProducto(TipoPrecioProducto tipoPrecioProducto) {
		this.tipoPrecioProducto = tipoPrecioProducto;
	}

	public void setUnidad(Unidad unidad) {
		this.unidad = unidad;
	}
}
